package com.cskaoyan.javase.oop.basic;

/**
 * @description: 3个对象的内存图，其中有两个引用指向同一个对象
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 *
 *3个对象的内存图，其中有两个引用指向同一个对象
 *
 *
 * 局部变量和成员变量：
 * > 局部变量和成员变量的比较，我们从以下四个方面：
 *
 * - 在类中定义的位置不同
 *   - 局部变量 方法或者方法的形参 局部位置
 *   - 成员变量 方法外 类中 成员位置
 * - 在内存中的位置不同
 *   - 局部变量 栈上
 *   - 成员变量 堆中的对象中
 * - 生命周期不同
 *   - 局部变量 随着方法的进出栈而存在而销毁
 *   - 成员变量 对象创建以后就生成了 对象销毁就没了
 *          你不要考虑引用没有了，对象仍然存在的这段过程成员变量的问题
 * - 初始化值不同
 *   -  局部变量 没有默认的初始化值,需要手动初始化
 *   -  成员变量 有默认的初始值
 *      -  char \u0000 绝对空字符
 *      -  boolean false
 *      引用数据类型：null
 *
 *
 * - 作用范围
 *   - 局部变量 只在方法范围内生效
 *   - 成员变量 对象当中，整个类的成员方法都可以使用，
 *          所以成员变量 也叫全局变量
 *     在加static的方法中，不能使用成员变量，原因挖个坑 后面讲static的时候填
 *     如果想要在static方法中用，要创建对象
 *     而普通成员方法中无需创建对象，直接用，这个原因下节课讲
 *
 */
public class Demo3 {
    public static void main(String[] args) {
        //创建三个Ox对象
        Ox o1 = new Ox();
        Ox o2 = o1;
        Ox o3 = new Ox();

        //打印o1 和 o2
        System.out.println(o1);
        System.out.println(o2);

        //操作o1对象
        o1.age = 18;
        o1.name = "花花牛";
        System.out.println(o2.name); //花花牛
        System.out.println(o2.age); //18

        //输出o3的属性
        System.out.println(o3.name); //null
        System.out.println(o3.age); //0

        //调用方法
        //对于普通成员方法而言，可以调用成员变量
        //成员方法也属于对象
        o2.eat();

    }
}

class Ox { //Ox
    //定义成员变量，属性
    String name;
    int age;

    //定义成员方法，行为
    //跑，睡觉，叫，吃饭
    public void run() {
        System.out.println("狂奔！");
    }

    public void sleep() {
        System.out.println("趴着睡！");
    }

    public void shout() {
        System.out.println("哞哞哞！");
    }

    //在eat方法当中加上成员变量
    public void eat() {
        System.out.println("名字为:" + name + "的牛，在吃干草，真香！");
    }

}
